package wt.rocket.ctrl.lider;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.*;
import wt.rocket.bd.model.ServicioDpto;
import wt.rocket.bd.model.ServicioLider;

/**
 * @author Waytech
 */
public class CtrlLiderRoles extends GenericForwardComposer {

  //widgets
  Div divMensaje;
  Label etqMensaje;
  Checkbox checkJefeDpto;
  Label etqJefeDpto, etqPorcentaje;
  Spinner spnPorcentaje;
  Div divJefeDpto;
  //data
  private ServicioLider servicioLider;
  private String descJefeDpto = "Sí";
  private boolean esJefeDpto = true;
  private String nombreDpto = "";
  //este id debe buscarse de la base de datos
  private int idLider = 1;
  //variables de control:
  private boolean cedulaProcesada;
  private Combobox cmbDpto;
  private ServicioDpto servicioDpto;
  private int porcentaje;

  @Override
  public void doAfterCompose(Component comp) throws Exception {
    super.doAfterCompose(comp);
    inicio();
  }

  public void inicio() {
    servicioLider = new ServicioLider();
    servicioDpto = new ServicioDpto();
    //PENDIENTE: se debe buscar el id de líder que se está viendo
    //PENDIENTE: se debe llenar la lista de Dptos

  }

  //TODO: mover este método para el final
  /**
   * muestra un mensaje para interacción con el usuario, en la parte superior
   * del formulario
   *
   * @param msj el mensaje a mostrar
   */
  private void mensaje(String msj) {
    etqMensaje.setValue(msj);
    etqMensaje.setVisible(true);
    System.out.println(this.getClass().toString() + msj);
  }

  //TODO: mover este método para el final
  /**
   * limpia el mensaje de estado
   */
  private void ocultarMensaje() {
    etqMensaje.setValue("");
    etqMensaje.setVisible(false);
  }

  /**
   * simula buscar el id del líder
   */
  public int getIdLider() {
    return 1;
  }

  public void onClick$etqJefeDpto() {
    cambiarEstadoJefeDpto();
  }

  public void onCheck$checkJefeDpto() {
    cambiarEstadoJefeDpto();
  }

  public void cambiarEstadoJefeDpto() {
    esJefeDpto = checkJefeDpto.isChecked();
    System.out.println("cambiarEstadoJefeDpto().valor = " + esJefeDpto);
    if (actualizarRolJefeDpto()) {
      mostrarRol(etqJefeDpto, !esJefeDpto);
    }
    //- checkJefeDpto.setChecked(!getCheckJefeDpto());
  }

  /**
   * setea la etiqueta del rol con los valores correspondientes: sí/no,
   * dependiendo del status true/false método reusable
   *
   * @param etqRol
   * @param status true o false
   */
  private void mostrarRol(Label etqRol, boolean status) {
    if (status) {
      etqRol.setValue("Sí");
      etqRol.setSclass("checksi");
    } else {
      etqRol.setValue("No");
      etqRol.setSclass("checkno");
    }
  }

  //TODO: quitar este método, no usado
  private void activarEditRolJefeDpto() {
    ocultarMensaje();
    //- etqJefeDpto.setVisible(false);
    checkJefeDpto.setValue(descJefeDpto);
    checkJefeDpto.setVisible(true);
    checkJefeDpto.setFocus(true);
  }

  void cancelarEditJefeDpto() {
    checkJefeDpto.setVisible(false);
    etqJefeDpto.setVisible(true);
  }

  /**
   * actualiza la cédula en la base de datos
   */
  boolean actualizarRolJefeDpto() {
    if (servicioLider.actualizarRolJefeDpto(getIdLider(), esJefeDpto)) {
      if (esJefeDpto) {
        mensaje("Se asignó rol como 'jefe de departamento'");
      } else {
        mensaje("Se quitó rol 'jefe de departamento'");
      }
      return true; //actualización exitosa
    } else {
      mensaje("Error: No se pudo realizar el cambio como jefe del departamento");
      return false; //actualización errada
    }
  }

  public void onClick$etqPorcentaje() {
    activarEditPorcentaje();
  }

  private void activarEditPorcentaje() {
    ocultarMensaje();
    String porc = etqPorcentaje.getValue();
    porcentaje = Integer.parseInt(porc);
    spnPorcentaje.setValue(porcentaje);
    etqPorcentaje.setVisible(false);
    spnPorcentaje.setVisible(true);
    spnPorcentaje.setFocus(true);
  }

  private void cancelarEditPorcentaje() {
    mostrarValorPorcentaje();
    spnPorcentaje.setVisible(false);
    etqPorcentaje.setVisible(true);
  }

  void mostrarValorPorcentaje() {
    etqPorcentaje.setValue("" + porcentaje);
  }
  
  public void onChange$spnPorcentaje() {
    procesarPorcentaje();
  }

  public void onOK$spnPorcentaje() {
    procesarPorcentaje();
    cancelarEditPorcentaje();
  }

  public void onBlur$spnPorcentaje() {
    cancelarEditPorcentaje();
  }
  
  private void procesarPorcentaje() {
    int nuevoValor = getValorSpinner(spnPorcentaje);
    if (nuevoValor == porcentaje) {
      //usuario dejó el valor vacío o dejó el valor anterior
      return;
    }
    //se cambió el valor
    if (servicioLider.actualizarPorcentaje(getIdLider(), nuevoValor)) {
      porcentaje = nuevoValor;
      mostrarValorPorcentaje();
    }
  }
  
  //este método que pretende ser reusable, sacarlo a la clase de utilería
  int getValorSpinner(Spinner spinner) {
    int valor;
    try {
      valor = spinner.getValue();
    } catch (Exception e) {
      valor = 0;
      System.out.println("CtrlReporteCelulaResultados.activarEditPorcentaje");
    }
    return valor;
  }
}